#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

class CRMQSolver {

private:

	int n, lgN, ptr;
	vector <int> lg;
	vector <double> a;
	vector <vector <double> > l;
    
public:
	
	explicit CRMQSolver( int elementsCount ){
		n = elementsCount;
		lgN = 0;
		while ((1 << lgN) <= n){
			lgN++;
		}
		ptr = 0;
		lg.resize(n + 1);
		a.resize(n);
		l.resize(lgN);
		for(int i = 0; i < lgN; i++){
			l[i].resize(n);
		}
	}
	~CRMQSolver(){
		lg.clear();
		a.clear();
		l.clear();
	}
	//Добавить элемент в конец массива. Можно вызывать только до запуска препроцессинга
	void AddElement( double element ){
		a[ptr++] = element;
	}
	//Построить таблицу
	void PreProcess(){
		for(int i = 1; i <= n; i++){
			lg[i] = -1;
		}
		for(int i = 0; i < lgN; i++){
			lg[(1 << i)] = i;
		}
		for(int i = 1; i <= n; i++){
			if(lg[i] == -1){
				lg[i] = lg[i - 1];
			}
		}
		for(int i = 0; i < n; i++){
			l[0][i] = a[i];
		}
		for(int i = 1; i < lgN; i++){
			for(int j = 0; j < n; j++){
				if(j + (1 << i) - 1 < n){
					l[i][j] = min(l[i - 1][j], l[i - 1][j + (1 << (i - 1))]);
				}
			}
		}
	}
	//Посчитать минимум на интервале [from, to)
	double CalcMin( int from, int to ) const {
		to--;
		return min(l[lg[to - from + 1]][from], l[lg[to - from + 1]][to - (1 << lg[to - from + 1]) + 1]);
	}

};


int main(){
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int n;
    scanf("%d", &n);
    CRMQSolver s(n);
	for(int i = 0; i < n; i++){
		double cur;
        scanf("%lf", &cur);
		s.AddElement(cur);
    }
    s.PreProcess();
    int m;
    scanf("%d", &m);
    for(int i = 0; i < m; i++){
        int L, R;
        scanf("%d %d", &L, &R);
        double ans = s.CalcMin(L, R);
        printf("%.18lf\n", ans);
    }
    return 0;
}
